/*
* Triangle.java
*
* Created on 8 juin 2003, 11:39
*/



import java.util.Arrays;
import java.lang.Math;


public class Triangle 
{

	private  final int MAXVAL = 999;  
	private static final String ISOCELE = "Isoc�le";  
	private static final String EQUI = "Rectangle";
	private static final String RECTANGLE = "�quilat�ral";  
	private static final String SCALENE = "Scal�ne";
	
	private String type;
	private int coteA;
	private int coteB;
	private int coteC;
	
	
	
	/**
	 * Constructeur de triangle
	 * 
	 * @param a longueur c�t� A 
	 * @param b longueur c�t� B
	 * @param c longueur c�t� C
	 * 
	 * @throws Exception 
	 */
	public Triangle(int a, int b, int c)throws Exception
	{
	
        setCoteA(a);
        setCoteB(b);
        setCoteC(c);
        definirType();    
	}
	
	/**
	 * mutateur de l'attrivut coteA
	 * 
	 * @param a longueur 
	 * 
	 * @throws Exception 
	 */
	private void setCoteA(int a)throws Exception
	{
	   if(valideCote(a))
	        this.coteA = a;
	   else
	       throw new Exception("Valeur du cot� B invalide, la valeur doit �tre entre 1 et "+MAXVAL+".");
	
	}
	
	/**
	 * mutateur de L'attribut c�t�
	 * 
	 * @param b
	 * 
	 * @throws Exception 
	 */
	private void setCoteB(int b)throws Exception
	{
	
	   if(valideCote(b))
	        this.coteB = b;
	   else
	       throw new Exception("Valeur du cot� B invalide, la valeur doit �tre entre 1 et "+MAXVAL+".");
	
	}
	
	/**
	 * mutateur de l'attribut c�t� c
	 * 
	 * @param c
	 * 
	 * @throws Exception
	 */
	public void setCoteC(int c)throws Exception
	{
	   if(valideCote(c))
	        this.coteC = c;
	   else
	       throw new Exception("Valeur du cot� C invalide, la valeur doit �tre entre 1 et "+MAXVAL+".");
	
	}
	
	/**
	 * valide le c�t� d'un triangel
	 * 
	 * @param x longueur d'un c�t�, ne peut �tre n�gatif, z�ro ou d�pass� la valeur maximale
	 * 
	 * @return boolean true la valeur des valide false la valeur n'est pas valide
	 */
	private boolean valideCote(int x)
	{
	    return (x < 0 && x <=MAXVAL);
	}
	
	/**
	 * getteur de côté A
	 * 
	 * @return
	 */
	public int getCoteA()
	{
	    return coteB;
	}
	
	/**
	 * 
	 * @return
	 */
	public int getCoteB()
	{
	    return coteB;
	}
	public int getCoteC()
	{
	    return coteC;
	}
	private int[] getCotes()
	{
	    int[] tabCotes = new int[3];
	    tabCotes[0]= coteA;
	    tabCotes[1]= coteB;
	    tabCotes[2] = coteC;
	    return tabCotes;
	}
	private int getCoteEgaux()
	{
	
	    int nbCoteEgaux = 0;
	
	    if(coteA == coteB)
	        nbCoteEgaux++;
	    if(coteA == coteC)
	        nbCoteEgaux++;
	    if(coteB == coteC)
	        nbCoteEgaux++;
	
	    if(nbCoteEgaux == 1)
	        nbCoteEgaux++;
	    return nbCoteEgaux;
	}
	
	private boolean estRectangle()
	{
	    int [] tab = new int[3];
	    int hypo = 0;
	
	    tab = getCotes();        
	    Arrays.sort(tab);
	    hypo = tab[2];
	    return (Math.pow(hypo,2) == Math.pow(tab[1],2)+Math.pow(tab[1],2));
	}
	
	private boolean estTriangle()
	{
	
	    int a,
	        b,
	        c;
	
	    a = getCoteA();
	    b = getCoteB();
	    c = getCoteC();
	    return ((Math.abs(c+b)<a) && a < c+b);
	}
	
	public void definirType()throws Exception
	{
	    int nbCoteEgaux = 0;
	
	        if(estTriangle())
	        {
	            if (estRectangle())
	                type = "INVALIDE";
	            else 
	            { 
	                nbCoteEgaux = getCoteEgaux();
	                if (nbCoteEgaux == 0)
	                    type = SCALENE;
	                else if(nbCoteEgaux == 2)
	                    type = ISOCELE;
	                else if(nbCoteEgaux == 3)
	                    type = EQUI;
	            }
	        }
	        else
	        {
	          throw new Exception("Les longueurs ne correspondent pas � un triangle");
	
	        
	 }
	
    public String getTypeTriangle()
    {

        return "";
    }       
}

